# coding: utf-8
"""
本模块的设置目前被各个模块各自自主导入作为默认值, 因此修改此处的值之后, 可能还需要
花些功夫找到是在哪个模块中生效的。

或许比较好维护的方案是模块中的参数都不设默认值, 而在顶级模块中统一设置吧。或者对默认
参数比较多的模块单独设置一个config文件。但是目前来说, 所有参数统一在一个配置文件中共
享使用问题应该不大。 （希望赛前不出意外ORZ）
    ——Stone
"""

# ===== ===== ===== ===== =====
# 图像相关
# ===== ===== ===== ===== =====
#   =====  基本参数  =====
CAMERA_DEVICE = 0

IMG_SIZE = (480, 320)
CNT_X = int(IMG_SIZE[0]/2)  # center x
CNT_Y = int(IMG_SIZE[1]/2)  # center y


#    ===== 颜色识别参数  =====
# 乒乓球, 设定红色阈值, HSV空间
RED_LOWER = [170, 100, 100]
RED_UPPER = [179, 255, 255]

#   =====  用于生成运动参量的参数  =====
# 基本概念：
#       代码不能放图, 还请读者努力想象 _(:з」∠)_
#       
#       camera 的俯仰角只有两个, 按状态称为： 抬头(look up)、低头(look down). 抬头找球, 低头抓球.
#       机械爪(paw)的位置只有两个：收起(paw_up), 放下(paw_up); 状态只有两个: 张开(open), 合起(close)
# 
#       照片中轴线：照片的竖对称轴。
#       机器中轴线：俯视机器, 由机器中心指向机器正前方画一条射线, 该射线在机器的中轴线上。
#       机器中轴面：过机器中轴线, 垂直地面作一平面即为中轴面。
#
# 适用条件：
#       虽然感觉有点多余, 但还是简单提一下。摄像头安装在机器正中间, 并且成像面（拍出来的照片本身）
#       与中轴面垂直, 这样才能应用controller.py中的控制算法。否则算法要复杂得多。

# 共用的基准参数
REF_X = CNT_X  # reference x

# camera 抬头时, 基准参数
REF_Y_LU = int(IMG_SIZE[1]/5)  # reference y look up

# camera 低头时, 基准参数
# 机械爪放下（抓球）时, 在照片中的位置。假设机械爪只有“收起”和“放下”两种状态。
POS_PAW = (CNT_X, int(IMG_SIZE[1]/5))
TOL_PAW_BALL = 20  # tolerance, unit: pixels, 当球和机械爪之间的距离小于该值时, 可以合上爪子,将球抓起


# ===== ===== ===== ===== =====
# 通信相关
# ===== ===== ===== ===== =====
SERIAL_PORT = '/dev/ttyAMA0'
SERIAL_TIMEOUT = 2  # seconds, timeout for read
BAUDRATE = 115200

ENCODING = 'utf-8'
EOL = b'\r\n'

MANAGER_IP = '127.0.0.1'
MANAGER_PORT = 8888  # this value is just for fun
MANAGER_AUTHKEY = b'abc'  # BaseManager的authkey默认为None, 此时使用current_process().authkey, 
#                         # 与其使用自己不知道的值, 还是自行统一设置比较好。


# ===== ===== ===== ===== =====
# 控制指令
# ===== ===== ===== ===== =====
# 所有指令应当为ASCII
ROTATE = 'RO'
MV_FB  = 'FB'

